/**
 * Copyright ? 2004 Shanghai je01 Co. Ltd.
 * All right reserved
 */
package cn.agiledata.bank.common.util;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

/**
 * @author jessik 2006-05-18
 * 
 * 提供对String对象的操作
 */
public class StringUtil {
	/**
	 * 判断str是否为空
	 * 
	 * @author:kevin
	 * @date:2004-12-22
	 * @param str
	 *            String
	 * @return boolean true:空;false:非空
	 */
	public static boolean isStrEmpty(String str) {
		return ((str == null) || (str.trim().equals("")));
	}

	/**
	 * 判断是否是手机号码
	 */
	public static boolean isMobile(String str) {
		// FIXME 逻辑错误，需要修正
		Pattern p = null; // 正则表达式

		Matcher m = null; // 操作的字符串

		boolean b;
		
		p = Pattern.compile("^1(3|4|5|8)[0-9]{9}$");

		m = p.matcher(str);

		b = m.matches();

		return b;
	}

	/**
	 * 判断是否是数字
	 */
	public static boolean isNumber(String str) {
		Pattern p = null; // 正则表达式

		Matcher m = null; // 操作的字符串

		boolean b;

		p = Pattern.compile("\\d+");

		m = p.matcher(str);

		b = m.matches();

		return b;
	}

	public static boolean isEmail(String str) {
		if (str == null) {
			return false;
		}
		Pattern p = null; // 正则表达式

		Matcher m = null; // 操作的字符串

		boolean b;

		// huangjie modify
		//p = Pattern.compile("@");
		p = Pattern.compile("^[a-zA-Z0-9_+.-]+\\@([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9]{2,4}$");

		m = p.matcher(str);

		b = m.find();

		return b;
	}

	/**
	 * 判断指定字符串是否匹配指定正则表达式
	 * 
	 * @param s
	 *            字符串
	 * @param pattern
	 *            正则表达式
	 * @return true if 指定字符串匹配指定正则表达式, otherwise false
	 */
	public static boolean matchRegex(String s, String pattern) {
		Matcher matcher = Pattern.compile(pattern).matcher(s);
		return matcher.matches();
	}

	public static boolean isIdcardNo(String idcardNo) {
		if (idcardNo == null || idcardNo.length() == 0)
			return false;
		String pattern = "([0-9]{8}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])[0-9]{3})" + "|"
				+ "([0-9]{6}(1[8-9]|2[0-1])[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])[0-9]{3}[0-9xX])";
		return matchRegex(idcardNo, pattern);
	}

	public static boolean isBankcardNo(String bankCardNo) {
		if (bankCardNo == null || bankCardNo.length() == 0)
			return false;
		String pattern = "([0-9]{6,32})";
		return matchRegex(bankCardNo, pattern);
	}

	/**
	 * 获取两个字符串相同的开始部分子串。若两个字符串没有相同的开始部分子串，则返回""；若有一个字符串为null，则返回null<br/>e.g.
	 * sameStart("abc","abd") will return "ab"
	 * 
	 * @param s1
	 *            字符串1
	 * @param s2
	 *            字符串2
	 * @return 两个字符串相同的开始部分子串
	 */
	public static String sameStart(String s1, String s2) {
		if (s1 == null || s2 == null)
			return null;
		String s = "";
		int length = s1.length() <= s2.length() ? s1.length() : s2.length();
		for (int i = 0; i < length; i++) {
			String c = s1.substring(i, i + 1);
			if (c.equals(s2.substring(i, i + 1))) {
				s += c;
			}
		}
		return s;
	}

	public static String replace(String parentStr, String ch, String rep) {
		int i = parentStr.indexOf(ch);
		StringBuffer sb = new StringBuffer();
		if (i == -1)
			return parentStr;
		sb.append(parentStr.substring(0, i) + rep);
		if (i + ch.length() < parentStr.length())
			sb.append(replace(parentStr.substring(i + ch.length(), parentStr.length()), ch, rep));
		return sb.toString();
	}

	public static String replaceFirstBr(String parentStr) {
		if (parentStr.startsWith("<br/>")) {
			parentStr = parentStr.substring(5);
		}
		if (parentStr.startsWith("&nbsp;")) {
			parentStr = parentStr.substring(6);
		}
		if (parentStr.startsWith("<br/>") || parentStr.startsWith("&nbsp;")) {
			replaceFirstBr(parentStr);
		}
		return parentStr;
	}

	/**
	 * 应用正则表达式过滤HTML标签
	 * 
	 * @param parentStr
	 *            需要过滤的字符串
	 * @return 不含html标签的字符串
	 */
	public static String replaceHtml(String parentStr) {
		// 定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script> }
		String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>";
		// 定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style> }
		String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>";
		// 定义HTML标签的正则表达式
		// String regEx_html = "<[^>]+>";//这个正则表达式对中文不支持
		String regEx_html = "<.+?>";

		// 含html标签的字符串
		String htmlStr = parentStr;
		// 不含html标签的字符串
		String textStr = "";
		Pattern pattern;
		Matcher matcher;

		pattern = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
		matcher = pattern.matcher(htmlStr);
		htmlStr = matcher.replaceAll("");

		pattern = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
		matcher = pattern.matcher(htmlStr);
		htmlStr = matcher.replaceAll("");

		pattern = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
		matcher = pattern.matcher(htmlStr);
		htmlStr = matcher.replaceAll("");

		textStr = htmlStr;
		return textStr;
	}

	public static boolean isFixedTel(String telephone) {
		if (telephone == null || telephone.length() == 0)
			return false;
		String pattern = "(010[0-9]{8})|(0[2-9][0-9]{9,10})";
		return matchRegex(telephone, pattern);
	}

	/**
	 * 格式化double型数字为字符串
	 * 
	 * @param d
	 *            数字
	 * @param pattern
	 *            格式，如#0.##
	 * @return 格式化字符串
	 */
	public static String double2String(double d, String pattern) {
		DecimalFormat formator = new DecimalFormat(pattern);
		return formator.format(d);
	}

	/**
	 * 截取身份证号码,后4位显示,前面隐藏
	 * 
	 * @param str
	 * @return
	 */
	public static String  hiddenStr(String str) {

		StringBuffer string = new StringBuffer();
		String bb = str.substring(str.length() - 4, str.length());

		for (int i = 1; i <= str.length() - 4; i++) {
			string.append("*");
		}
		string.append(bb);
		return string.toString();

	}
	
    public static String getNotNullValue(String string) {
    	return string == null ? "" : string;
    }
    
    public static String getNotValue(String string) {
    	return string == null ? "null" : string;
    }

	public static void main(String[] args) {
	}
	
	/** 
	 * 	截取中英文混和字符串
	 *   第一个参数，传入的是要截的中英文字符串，第二个参数，要截取的长度。 
	 *   @param   str 
	 *   @param   subBytes 
	 *   @return   str 
	 */
	public static String subString(String str, int subBytes) {
		int bytes = 0; //   用来存储字符串的总字节数
		boolean bolAddPoints = false;
		String strReturn = "";
		if(subBytes > 5) {
			// 预留省略号位数
			subBytes = subBytes - 3;
			bolAddPoints = true;
		}
		
		for (int i = 0; i < str.length(); i++) {
			if (bytes == subBytes) {
				strReturn = str.substring(0, i);
				break;
			}
			char c = str.charAt(i);
			if (c < 256) {
				bytes += 1; //   英文字符的字节数看作1 
			} else {
				bytes += 2; //   中文字符的字节数看作2 
				if (bytes - subBytes == 1) {
					strReturn = str.substring(0, i);
					break;
				}
			}
		}
		
		if(bytes>= subBytes && bolAddPoints) {
			// 需要处理的字符串超过规定长度，增加省略号
			strReturn = strReturn + "...";
		}
		else {
			strReturn = str;
		}
		
		return strReturn;
	}
	
	/**
     * 将用指定符号分隔的数据解析为List
     * 
     * @param _str  需要拆分的字符串
     * @param _dot  分隔符
     * @return List
     */
    public static List convertStringToList(String _str, String _dot){
        if (_str == null) return null;
        StringTokenizer st = new StringTokenizer(_str,_dot);

        List result = new ArrayList();

        while (st.hasMoreTokens()){
            result.add(st.nextToken());
        }
        return result;
    }
    
	
	/**
	 * 根据短信内容的长度决定是否附加域名
	 * 短信发送最大长度为59(中、英、数字均算作一个长度)
	 * 如短信内容加入域名不会超出长度，则在结尾附加域名
	 * 
	 * @param context
	 * @return
	 * @deprecated
	 */
	public static String appendWebSiteUrl(String context) {
		/*if(context == null || context.trim().length() == 0) {
			return context;
		}
		int intMaxLen = 59;		// 短信最大长度
		int intContextLen = context.length();	// 发送内容长度
		String strAppendUrl = "";		// 附加域名
		int intAppendLen = strAppendUrl.length();	// 附加域名长度
		
		if(intMaxLen - intContextLen > intAppendLen) {
			// 短信内容长度可以附加域名
			context += strAppendUrl;
		}*/
		
		return context;
	}
	
	/**
	 * 生成指定长度的随机数字，并将数字转化为ascii
	 * @param length 1-8位
	 * @return  ascii字符串
	 */
	public static String generalStringToAscii(int length){
		
		int num = 1;
		for (int i = 0; i < length; i++){
			num *= 10;
		}
		
		Random rand = new Random((new Date()).getTime());
		String strRandom = Integer.toString(rand.nextInt(num));
		
		strRandom = StringUtils.leftPad(strRandom, length, '0');
				
		StringBuffer sb = new StringBuffer();  
		char[] chars = strRandom.toCharArray();   
	    for (int i = 0; i < chars.length; i++) {  
	    	sb.append((int)chars[i]);  
	    }
	    
	    return sb.toString();  
	}
	
	/**
	 * 把16进制字符串转化为字节数组
	 * 
	 * @param hex
	 * @return
	 */
	public static byte[] hexToBytes(String hex) {
		byte[] buffer = new byte[hex.length() / 2];
		String strByte;

		for (int i = 0; i < buffer.length; i++) {
			strByte = hex.substring(i * 2, i * 2 + 2);
			buffer[i] = (byte) Integer.parseInt(strByte, 16);
		}

		return buffer;
	}
	
	public static String generateMsgItem(String itemName,Object itemValue) {
		if(itemName == null || itemName.trim().length() == 0) { 
			// ������
			return "";
		}
		
		if(itemValue == null || itemValue.toString().trim().length() == 0) {
			itemValue = "";
		}
		
		String strReturn = "\""+itemName+"\""+":"+ "\""+itemValue+"\"";
		
		return strReturn;
	}
	
}